package com.example.controller;

import cn.dev33.satoken.stp.StpUtil;
import cn.dev33.satoken.util.SaResult;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * 登录测试
 */
@RestController
@RequestMapping("/acc/")
public class LoginController {

    // 测试登录  ---- http://localhost:8081/acc/doLogin?name=zhang&pwd=123456
    @GetMapping("doLogin")
    public SaResult doLogin(String name, String pwd) {
        // 此处仅作模拟示例，真实项目需要从数据库中查询数据进行比对
        if ("zhang".equals(name) && "123456".equals(pwd)) {
            StpUtil.login(10001);
            return SaResult.ok("登录成功");
        }
        return SaResult.error("登录失败");
    }

    // 查询登录状态  ---- http://localhost:8081/acc/isLogin
    @GetMapping("isLogin")
    public SaResult isLogin() {
        return SaResult.ok("是否登录：" + StpUtil.isLogin());
    }

    // 查询 Token 信息  ---- http://localhost:8081/acc/tokenInfo
    @GetMapping("tokenInfo")
    public SaResult tokenInfo() {
        return SaResult.data(StpUtil.getTokenInfo());
    }


    // 类似查询API还有：
    @GetMapping("tokenInfoString")
    public SaResult tokenInfoString() {
        return SaResult.data(StpUtil.getLoginIdAsString());
    }

    // 获取当前会话账号id, 并转化为`String`类型
    @GetMapping("tokenInfoInt")
    public SaResult tokenInfoInt() {
        return SaResult.data(StpUtil.getLoginIdAsInt());
    }

    @GetMapping("tokenInfoLong")
    public SaResult tokenInfoLong() {
        return SaResult.data(StpUtil.getLoginIdAsLong());
    }

// ---------- 指定未登录情形下返回的默认值 ----------

    // 获取当前会话账号id, 如果未登录，则返回 null
    @GetMapping("getLoginIdDefaultNull")
    public SaResult getLoginIdDefaultNull() {
        return SaResult.data(StpUtil.getLoginIdDefaultNull());
    }

    // 获取当前会话账号id, 如果未登录，则返回默认值 （`defaultValue`可以为任意类型）
    @GetMapping("getLoginId()")
    public SaResult getLoginId() {
        return SaResult.data(StpUtil.getLoginId());
    }

    // 测试注销  ---- http://localhost:8081/acc/logout
    @GetMapping("logout")
    public SaResult logout() {
        StpUtil.logout();
        return SaResult.ok();
    }

    @GetMapping("getTokenValue")
    public SaResult getTokenValue() {
// 获取当前会话的 token 值
        return SaResult.data(StpUtil.getTokenValue());
    }

    // 获取当前`StpLogic`的 token 名称
    @GetMapping("getTokenName")
    public SaResult getTokenName() {
        return SaResult.data(StpUtil.getTokenName());
    }

    // 获取指定 token 对应的账号id，如果未登录，则返回 null
    @GetMapping("getLoginIdByToken")
    public SaResult getLoginIdByToken() {
        return SaResult.data(StpUtil.getLoginIdByToken(StpUtil.getTokenValue()));
    }

    @GetMapping("getTokenTimeout")
    public Object getTokenTimeout() {
// 获取当前会话剩余有效期（单位：s，返回-1代表永久有效）
        return SaResult.data(StpUtil.getTokenTimeout());
    }

    @GetMapping("getTokenInfo")
    public Object getTokenInfo() {
// 获取当前会话的 token 信息参数
        return SaResult.data(StpUtil.getTokenInfo());
    }
}


